#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
#include <sys/time.h>
#include <unistd.h>
#include <time.h>

int main(int argc, char const *argv[])
{

    struct stat buf;
    int res = stat(argv[1], &buf);

    if (res != 0)
    {
        perror("stat");
        return -1;
    }
    printf("%d %#x  size: %ld\n", buf.st_mode, buf.st_mode, buf.st_size);
    printf("uid: %d  gid: %d\n", buf.st_uid, buf.st_gid);
    printf("uid: %d  gid: %d\n", buf.st_uid, buf.st_gid);
    printf("%d\n", S_ISREG(buf.st_mode));
    struct timespec tv = buf.st_atim;
    printf("tv = %ld\n", tv.tv_sec);
    printf("tv = %ld\n", buf.st_atim.tv_sec);
    printf("%s\n", ctime(&tv.tv_sec));

    char mod[10];
    bzero(mod, 10);
    char rwx[3] = {'r', 'w', 'x'};
    for (int i = 0; i < 9; i++)
    {
        mod[i] = buf.st_mode & (0400 >> i) ? rwx[i % 3] : '-';
    }
    printf("文件权限：%s\n", mod);

    // -rw-rw-r-- 1 gec gec     6  8月 23 14:33 test.txt
    // st_mode  1000文件类型    000 suid + sgid + stickybit     110 110 100 文件权限

    // 1000 000 110 110 100

    // 100 000 000  >> 0   ===> 100 000 000
    // 100 000 000  >> 1   ===> 010 000 000
    // 100 000 000  >> 2   ===> 001 000 000

    // 110 110 100
    // 100 000 000  &
    // 100 000 000  ===> r

    // 110 110 100
    // 010 000 000  &
    // 010 000 000  ===> w

    // 110 110 100
    // 001 000 000  &
    // 000 000 000  ====> -

    return 0;
}
